package com.qiniuyun.threedgenerator.serviceImpl;



import com.qiniuyun.threedgenerator.service.FileStorageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;

import java.net.MalformedURLException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

@Slf4j
@Service
public class FileStorageServiceImpl implements FileStorageService {

    private final Path fileStorageLocation;

    public FileStorageServiceImpl() {
        // 设置文件存储目录
        this.fileStorageLocation = Paths.get("uploads/models").toAbsolutePath().normalize();
        try {
            java.nio.file.Files.createDirectories(this.fileStorageLocation);
        } catch (Exception ex) {
            throw new RuntimeException("无法创建文件存储目录", ex);
        }
    }

    @Override
    public Resource loadModelAsResource(String filename, String format) {
        try {
            Path filePath = this.fileStorageLocation.resolve(filename).normalize();
            Resource resource = new UrlResource(filePath.toUri());

            if (resource.exists()) {
                return resource;
            } else {
                throw new RuntimeException("文件未找到: " + filename);
            }
        } catch (MalformedURLException ex) {
            throw new RuntimeException("文件读取错误: " + filename, ex);
        }
    }

    @Override
    public String generateShareLink(Long modelId, String username, Integer expireDays) {
        // 生成分享token（简化实现）
        String shareToken = UUID.randomUUID().toString();

        // 在实际应用中，这里应该将token与模型信息关联并存储到数据库
        // 设置过期时间等

        // 返回分享链接（简化版）
        return "http://localhost:8080/api/files/shared/" + shareToken;
    }

    /**
     * 验证分享token（可选功能）
     */
    public boolean validateShareToken(String shareToken) {
        // 在实际应用中，这里应该查询数据库验证token的有效性和过期时间
        // 简化实现：假设所有token都有效
        return shareToken != null && !shareToken.trim().isEmpty();
    }

    /**
     * 根据token获取模型文件信息（可选功能）
     */
    public String getModelFilenameByToken(String shareToken) {
        // 在实际应用中，这里应该根据token查询对应的模型文件
        // 简化实现：返回一个示例文件名
        return "example_model.gltf";
    }
}